/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Controle;

import Dao.DAO;
import Dao.FormulaParametrosBD;
import Dao.Singleton;
import Modelo.*;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import javax.swing.JOptionPane;

/**
 *
 * @author Andre Luiz
 */
public class Controlador {

    private static Pedido pedidoAtual = new Pedido();
    private static ArrayList<Pedido> listaPedidos = new ArrayList<>();

    public static Pedido getPedidoAtual() {
        return pedidoAtual;
    }

    public static ArrayList<Pedido> getListaPedidos() {
        return listaPedidos;
    }

    public static void setListaPedidos(ArrayList<Pedido> listaPedidos) {
        Controlador.listaPedidos = listaPedidos;
    }

    public static void conectarBancoDados() {
        try {
            if (Singleton.connect("localhost", 5432, "sisep", "postgres", "postgres")) {
            } else {
                throw new Exception("erro ao Conectar ao Danco de Dados");
            }
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, e, "Erro!", 0);

        }
    }

    public static boolean salvar_Pedido(boolean entrega) {
        try {
            Integer codEndereco;
            if (entrega) {
                if (pedidoAtual.getEndEntrega() != null) {
                    codEndereco = DAO.insertRetornoPK(FormulaParametrosBD.parametrosBD(pedidoAtual.getEndEntrega().toStringSQL_Insert()), "codigo");
                    pedidoAtual.setCodigo_endereco_entrega(codEndereco);
                } else {
                    pedidoAtual.setCodigo_endereco_entrega(DAO.selectColuna("\"Cliente\"", "codigo_endereco", "WHERE codigo = " + pedidoAtual.getCodigo_cliente()));
                }
            }

            Integer codPedido = DAO.insertRetornoPK(FormulaParametrosBD.parametrosBD(pedidoAtual.toString_Insert()), "codigo");
            if (codPedido != -1) {
                for (int i = 0; i < pedidoAtual.getListaItens().size(); i++) {
                    if (pedidoAtual.getListaItens().get(i) instanceof Acompanhamento) {
                        ItemAcompanhamento aux = new ItemAcompanhamento() ;
                        aux.setAcomp((Acompanhamento)pedidoAtual.getListaItens().get(i));
                        aux.setParametrosInterno(codPedido);
                        DAO.insert(FormulaParametrosBD.parametrosBD(aux.toStringSQL_Insert()));
                    }
                    if (pedidoAtual.getListaItens().get(i) instanceof Pizza) {
                        Pizza aux = (Pizza) pedidoAtual.getListaItens().get(i);
                        aux.setParametrosInterno(codPedido);
                        //aux.setCodigo_pedido(codPedido);
                        DAO.insert(FormulaParametrosBD.parametrosBD(aux.toStringSQL_Insert()));
                    }

                }
                JOptionPane.showMessageDialog(null, "O Pedido foi cadastrado com Sucesso!", "Pedido Concluido", 1);
                return true;
            } else {
                throw new Exception("Erro ao Cadastrar os dados no Banco de Dados!");
            }


        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, "Erro!\n Não foi possivel salvar o Pedido\n" + ex.getMessage(), "Erro!", 0);
            return false;
        }
    }
    
    public static boolean salvar_ItemPizzaPedido(Pizza pizza){
        try {
            if(DAO.insert(FormulaParametrosBD.parametrosBD(pizza.toStringSQL_Insert(), " WHERE codigo=" + pizza.getCodigo_pizza_pedido()))){
                Float valor = calcularValorPedido(pizza.getCodigo_pedido());
                DAO.comandoSQL("UPDATE \"Pedido\" SET valor_total="+valor+" WHERE codigo = "+pizza.getCodigo_pedido());
                JOptionPane.showMessageDialog(null, "A Pizza foi Cadastrada com Sucesso!");
                return true;
            }else{
                throw new Exception("Erro ao Cadastradar dados na tabela ItemPizzaPedido");
            }
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, "Erro!\n Não foi possivel Cadastradar a Pizza\n" + ex.getMessage());
            return false;
        }
    }
    
    public static boolean salvar_ItemAcompanhamentoPedido(Acompanhamento acomp, int codigoPedido){
        try {
            ItemAcompanhamento aux = new ItemAcompanhamento() ;
            aux.setAcomp((Acompanhamento) acomp);
            aux.setParametrosInterno(codigoPedido);
            
            if(DAO.insert(FormulaParametrosBD.parametrosBD(aux.toStringSQL_Insert()))){
                Float valor = calcularValorPedido(codigoPedido);
                DAO.comandoSQL("UPDATE \"Pedido\" SET valor_total="+valor+" WHERE codigo = "+codigoPedido);
                JOptionPane.showMessageDialog(null, "O Acompanhamento foi Cadastrada com Sucesso!");
                return true;
            }else{
                throw new Exception("Erro ao Cadastradar dados na tabela ItemAcompanhamentoPedido");
            }
            
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, "Erro!\n Não foi possivel Cadastradar o Acompanhamento\n" + ex.getMessage());
            return false;
        }
    }
            

    public static boolean salvar_Cliente(Cliente c) {
        try {
            Integer codEndereco = null;
            if (c.getEndereco() != null) {
                codEndereco = DAO.insertRetornoPK(FormulaParametrosBD.parametrosBD(c.getEndereco().toStringSQL_Insert()), "codigo");
                c.setCodigo_endereco(codEndereco);
            }
            DAO.insert(FormulaParametrosBD.parametrosBD(c.toStringSQL_InsertFK()));
            JOptionPane.showMessageDialog(null, "O cliente foi cadastrado com Sucesso!");
            return true;
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, "Erro!\n Não foi possivel salvar o cliente\n" + ex);
            return false;
        }
    }
    
    public static boolean salvar_EnderecoEntregaPedido(Endereco end, int codigoPedido){
        try {
            Integer codEndereco = DAO.insertRetornoPK(FormulaParametrosBD.parametrosBD(end.toStringSQL_Insert()), "codigo");
            DAO.comandoSQL("UPDATE \"Pedido\" SET codigo_endereco_entrega ="+ codEndereco +" WHERE codigo = "+codigoPedido);
            JOptionPane.showMessageDialog(null, "Endereco de Entegar Editado com Sucesso!", "Endereço de Entrega", 1);
            return true;
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Erro ao Editar o Endereco de Entegar!\n"+e.getMessage(), "Endereço de Entrega", 0);
            return false;
        }
    }
    
    public static boolean editar_EnderecoEntregaPedido(Endereco end, int codigoPedido, int codigoEndEntrega){
        try {
            DAO.update(FormulaParametrosBD.parametrosBD_Update(end.toStringSQL_Update(), " WHERE codigo="+codigoEndEntrega));
            //DAO.comandoSQL("UPDATE \"Pedido\" SET codigo_endereco_entrega ="+ codEndereco +" WHERE codigo = "+codigoPedido);
            JOptionPane.showMessageDialog(null, "Endereco de Entegar Editado com Sucesso!", "Endereço de Entrega", 1);
            return true;
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Erro ao Editar o Endereco de Entegar!\n"+e.getMessage(), "Endereço de Entrega", 0);
            return false;
        }
    }

    public static boolean salvar_Acompanhamento(ArrayList<String> dadosVisao) {
        Acompanhamento acomp = convertDadosVisaoToModeloAcompanhamento(dadosVisao);
        try {
            DAO.insert(FormulaParametrosBD.parametrosBD(acomp.toStringSQL_Insert()));
            JOptionPane.showMessageDialog(null, "O Acompanhamento foi cadastrado com Sucesso!");
            return true;
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, "Erro!\n Não foi possivel salvar o Acompanhamento\n" + ex);
            return false;
        }
    }

    public static boolean salvar_Sabor(ArrayList<String> dadosVisao) {
        Sabor sabor = convertDadosVisaoToModeloSabor(dadosVisao);
        try {
            DAO.insert(FormulaParametrosBD.parametrosBD(sabor.toStringSQL_Insert()));
            JOptionPane.showMessageDialog(null, "O Sabor foi cadastrado com Sucesso!");
            return true;
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, "Erro!\n Não foi possivel salvar o Sabor\n" + ex);
            return false;
        }
    }

    public static boolean salvar_Categoria(ArrayList<String> dadosVisao) {
        Categoria categoria = convertDadosVisaoToModeloCategoria(dadosVisao);
        try {
            DAO.insert(FormulaParametrosBD.parametrosBD(categoria.toStringSQL_Insert()));
            JOptionPane.showMessageDialog(null, "A Categoria foi cadastrada com Sucesso!");
            return true;
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, "Erro!\n Não foi possivel salvar a Categoria\n" + ex);
            return false;
        }
    }

    public static boolean salvar_Cliente(ArrayList<String> dadosVisao) {
        Cliente cliente = convertDadosVisaoToModeloCliente(dadosVisao);
        try {
            int codigo_endereco = DAO.insertRetornoPK(FormulaParametrosBD.parametrosBD(cliente.getEndereco().toStringSQL_Insert()), "codigo");
            if (codigo_endereco >= 0) {
                cliente.setCodigo_endereco(codigo_endereco);
                DAO.insert(FormulaParametrosBD.parametrosBD(cliente.toStringSQL_InsertFK()));
                JOptionPane.showMessageDialog(null, "O Cliente foi cadastrado com Sucesso!");
                return true;
            } else {
                throw new Exception("Não foi possivel Cadastrar o Endereço do Cliente");
            }
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, "Erro!\n Não foi possivel Cadastrar o Cliente\n" + ex);
            return false;
        }
    }

    public static boolean editar_Acompanhamento(ArrayList<String> dadosVisao) {
        Acompanhamento acomp = convertDadosVisaoToModeloAcompanhamento(dadosVisao);
        try {
            DAO.update(FormulaParametrosBD.parametrosBD(acomp.toStringSQL_Update(), " WHERE codigo=" + acomp.getCodigo()));
            JOptionPane.showMessageDialog(null, "O Acompanhamento foi Alterado com Sucesso!");
            return true;
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, "Erro!\n Não foi possivel Alterar o Acompanhamento\n" + ex);
            return false;
        }
    }

    public static boolean editar_Pedido(Float valorEntrega, Float desc, Float valorTotal, int codigoPedido){
        try {
            
            //Float valor = calcularValorPedido(codigoPedido);
            
            DAO.comandoSQL("UPDATE \"Pedido\" SET valor_entrega = "+ valorEntrega +", desconto = "+desc + ""
                    + ", valor_total="+valorTotal+" WHERE codigo = "+codigoPedido);
            JOptionPane.showMessageDialog(null, "O Pedido foi Alterado com Sucesso!");
            return true;
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, "Erro!\n Não foi possivel Pedido o Pedido\n" + ex.getMessage());
            return false;
        }
    }
    
    public static boolean editar_ItemPizzaPedido(Pizza pizza){
        try {
            if(DAO.update(FormulaParametrosBD.parametrosBD_Update(pizza.toStringSQL_Update(), " WHERE codigo_pizza_pedido=" + pizza.getCodigo_pizza_pedido()))){
                Float valor = calcularValorPedido(pizza.getCodigo_pedido());
                System.out.println("valor Pedido: "+valor);
                DAO.comandoSQL("UPDATE \"Pedido\" SET valor_total="+valor+" WHERE codigo = "+pizza.getCodigo_pedido());
                JOptionPane.showMessageDialog(null, "A Pizza foi Alterada com Sucesso!");
                return true;
            }else{
                throw new Exception("Erro ao editar dados na tabela ItemPizzaPedido");
            }
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, "Erro!\n Não foi possivel Alterar a Pizza\n" + ex.getMessage());
            return false;
        }
    }
    
    public static boolean editar_ItemAcompanhamentoPedido(Acompanhamento acomp, int codigoPedido, int codigoItemAcomp){
        try {
            ItemAcompanhamento aux = new ItemAcompanhamento() ;
            aux.setAcomp((Acompanhamento) acomp);
            aux.setParametrosInterno(codigoPedido);
            
            if(DAO.update(FormulaParametrosBD.parametrosBD(aux.toStringSQL_Update()," WHERE codigo_item_acompanhamento_pedido=" +codigoItemAcomp))){
                Float valor = calcularValorPedido(codigoPedido);
                DAO.comandoSQL("UPDATE \"Pedido\" SET valor_total="+valor+" WHERE codigo = "+codigoPedido);
                JOptionPane.showMessageDialog(null, "O Acompanhamento foi Editado com Sucesso!");
                return true;
            }else{
                throw new Exception("Erro ao Editar dados na tabela ItemAcompanhamentoPedido");
            }
            
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, "Erro!\n Não foi possivel Editar o Acompanhamento\n" + ex.getMessage());
            return false;
        }
    }
    
    public static boolean editar_Sabor(ArrayList<String> dadosVisao) {
        Sabor sabor = convertDadosVisaoToModeloSabor(dadosVisao);
        try {
            DAO.update(FormulaParametrosBD.parametrosBD(sabor.toStringSQL_Update(), " WHERE codigo=" + sabor.getCodigo()));
            JOptionPane.showMessageDialog(null, "O Sabor foi Alterado com Sucesso!");
            return true;
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, "Erro!\n Não foi possivel Alterar o Sabor\n" + ex.getMessage());
            return false;
        }
    }

    public static boolean editar_Categoria(ArrayList<String> dadosVisao) {
        Categoria categoria = convertDadosVisaoToModeloCategoria(dadosVisao);
        try {
            DAO.update(FormulaParametrosBD.parametrosBD(categoria.toStringSQL_Update(), " WHERE codigo=" + categoria.getCodigo()));
            JOptionPane.showMessageDialog(null, "A Categoria foi Alterada com Sucesso!");
            return true;
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, "Erro!\n Não foi possivel Alterar a Categoria\n" + ex.getMessage());
            return false;
        }
    }

    public static boolean editar_Cliente(ArrayList<String> dadosVisao) {
        Cliente cliente = convertDadosVisaoToModeloCliente(dadosVisao);
        try {

            DAO.update(FormulaParametrosBD.parametrosBD(cliente.toStringSQL_Update(), " WHERE codigo=" + cliente.getCodigo()));
            String codigo_endereco = DAO.selectColuna("\"Cliente\"", "codigo_endereco", "WHERE codigo=" + cliente.getCodigo());
            DAO.update(FormulaParametrosBD.parametrosBD(cliente.getEndereco().toStringSQL_Update(), " WHERE codigo=" + codigo_endereco));
//            if(cliente.get!=null){
//                DAO.update(FormulaParametrosBD.parametrosBD(cliente.getEndereco().toStringSQL_Update()));
//            }
            JOptionPane.showMessageDialog(null, "O Cliente foi Alterado com Sucesso!");
            return true;
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, "Erro!\n Não foi possivel Alterar o Cliente\n" + ex.getMessage());
            return false;
        }
    }

    public static boolean remover_Categoria(int codigo) {
        Categoria categoria = carregarDadosBD_Categoria(codigo);

        ResultSet res = DAO.selectAll("\"Sabor\"", "WHERE codigo_categoria=" + categoria.getCodigo() + " AND " + "removido=false");
        try {
            if (res != null && res.next()) {
                JOptionPane.showMessageDialog(null, "Erro!\nNão foi possivel Remover a Categoria\n"
                        + "Pois existe um ou mais Sabor(es) utilizando esta Categoria\nPrimeiramente Remova ou Altere todos os sabores que possuem esta Categoria  ", "Remover Categoria", 0);
                return false;
            }
        } catch (SQLException ex) {
        }

        categoria.setRemovido(true);
        try {
            DAO.update(FormulaParametrosBD.parametrosBD(categoria.toStringSQL_Remove(), " WHERE codigo=" + categoria.getCodigo()));
            JOptionPane.showMessageDialog(null, "A Categoria foi Removida com Sucesso!", "Tarefa Concluida com Sucesso", 1);
            return true;
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, "Erro!\n Não foi possivel Remover a Categoria\n" + ex.getMessage(), "Erro!", 0);
            return false;
        }
    }

    public static boolean remover_Acompanhamento(int codigo) {
        Acompanhamento acomp = carregarDadosBD_Acompanhamento(codigo);
        acomp.setRemovido(true);
        try {
            DAO.update(FormulaParametrosBD.parametrosBD(acomp.toStringSQL_Remove(), " WHERE codigo=" + acomp.getCodigo()));
            JOptionPane.showMessageDialog(null, "O Acompanhamento foi Removido com Sucesso!");
            return true;
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, "Erro!\n Não foi possivel Remover o Acompanhamento\n" + ex.getMessage());
            return false;
        }
    }

    public static boolean remover_Sabor(int codigo) {
        Sabor sabor = carregarDadosBD_Sabor(codigo);
        sabor.setRemovido(true);
        try {
            DAO.update(FormulaParametrosBD.parametrosBD(sabor.toStringSQL_Remove(), " WHERE codigo=" + sabor.getCodigo()));
            JOptionPane.showMessageDialog(null, "O Sabor foi Removido com Sucesso!");
            return true;
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, "Erro!\n Não foi possivel Remover o Sabor\n" + ex.getMessage());
            return false;
        }
    }

    public static boolean remover_Cliente(int codigo) {
        Cliente cliente = carregarDadosBD_Cliente(codigo);
        cliente.setRemovido(true);
        try {
            DAO.update(FormulaParametrosBD.parametrosBD(cliente.toStringSQL_Remove(), " WHERE codigo=" + cliente.getCodigo()));
            JOptionPane.showMessageDialog(null, "O Cliente foi Removido com Sucesso!");
            return true;
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, "Erro!\n Não foi possivel Remover o Cliente\n" + ex.getMessage());
            return false;
        }
    }
    
    public static float calcularValorPedido(int codigo){
        try {
            float valorPedido=0;
            
            ResultSet  res =DAO.comandoSQL("SELECT valor FROM \"ItemAcompanhamentoPedido\"  WHERE codigo_pedido="+codigo); 
            while(res.next()){
                valorPedido += res.getFloat("valor");
            }
            res =DAO.comandoSQL("SELECT valor FROM \"ItemPizzaPedido\"  WHERE codigo_pedido="+codigo); 
            while(res.next()){
                valorPedido += res.getFloat("valor");
            }
            res =DAO.comandoSQL("SELECT valor_entrega, desconto FROM \"Pedido\" WHERE codigo="+codigo); 
            if(res.next()){
                valorPedido += res.getFloat("valor_entrega");
                valorPedido -= res.getFloat("desconto");
            }
            return valorPedido;
        } catch (Exception e) {
            System.out.println("Erro ao Calcular o Valor do Pedido\n"+e.getMessage());
            return 0;
        }
    }
    
    public static ResultSet carregarPedido_BD(int codigo){
        return DAO.selectAll("\"Pedido\"", " WHERE codigo="+codigo);
    }
    
    public static Pizza carregarPizza_BD(int codigo){
        ResultSet result = DAO.selectAll("\"ItemPizzaPedido\"", " WHERE codigo_pizza_pedido="+codigo);
        Pizza pizza = new Pizza();
        pizza.setALL(result, true);
        return pizza;
    }

    public static ArrayList<ArrayList<String>> carregarDadosBD_Pedidos(){
        ArrayList<ArrayList<String>> pedidos = new ArrayList<>();
        ResultSet result = DAO.comandoSQL("SELECT a.codigo, a.codigo_cliente, b.nome, a.codigo_endereco_entrega, a.valor_entrega, a.desconto, a.valor_total, a.status" + 
                " From \"Pedido\" AS a, \"Cliente\"AS b WHERE a.codigo_cliente = b.codigo AND a.status!='Finalizado' AND a.status!='Cancelado' AND a.removido = false" );
        
        if (result != null) {
            try {
                while (result.next()) {
                    ArrayList<String> ped = new ArrayList<String>();
                    ped.add(result.getString("codigo"));
                    ped.add(result.getString("codigo_cliente"));
                    ped.add(result.getString("nome"));
                    if(result.getString("codigo_endereco_entrega")== null || result.getString("codigo_endereco_entrega").equals("")){
                        ped.add("NÃO");
                    }else{
                        ped.add("SIM");
                    }
                    
                    ped.add(result.getString("valor_entrega"));
                    ped.add(result.getString("desconto"));
                    ped.add(result.getString("valor_total"));
                    ped.add(result.getString("status"));
                    
                    pedidos.add(ped);
                }
                
                return pedidos;
            } catch (Exception ex) {
                System.out.println("Erro!" + ex.getMessage());
                return null;
            }
        } else {
            return null;
        }

    }
    
    public static ArrayList<ArrayList<String>> carregarDadosBD_ItemPizzaPedido(Integer codPed) {
        ArrayList<ArrayList<String>> pedidos = new ArrayList<>();
        ResultSet result = DAO.comandoSQL("SELECT a.codigo_sabor_1, a.codigo_sabor_2, a.codigo_sabor_3, a.codigo_sabor_4, valor "
                + "FROM \"ItemPizzaPedido\" AS a, \"Pedido\" AS b "
                + "WHERE a.codigo_pedido=b.codigo AND a.codigo_pedido = "+ codPed );
        
        ResultSet res;
        if (result != null) {
            try {
                while (result.next()) {
                    ArrayList<String> ped = new ArrayList<String>();
                    String tamanho = null;
                    String sabores = null;
                    
                    //Sabor 1
                    res = DAO.comandoSQL("SELECT nome,codigo_categoria FROM \"Sabor\" WHERE codigo="+result.getString("codigo_sabor_1"));
                    if(res.next()){
                        sabores = "; "+res.getString("nome");
                        res = DAO.comandoSQL("SELECT tamanho FROM \"Categoria\" WHERE codigo="+res.getString("codigo_categoria"));
                        if(res.next()){
                            tamanho=res.getString("tamanho");
                        }
                    }
                    
                    //Sabor 2
                    res = DAO.comandoSQL("SELECT nome,codigo_categoria FROM \"Sabor\" WHERE codigo="+result.getString("codigo_sabor_2"));
                    if(res.next()){
                        sabores += "; "+res.getString("nome");
                        if(tamanho == null){
                            res = DAO.comandoSQL("SELECT tamanho FROM \"Categoria\" WHERE codigo="+res.getString("codigo_categoria"));
                            if(res.next()){
                                tamanho=res.getString("tamanho");
                            }
                        }
                       
                    }
                    
                    //Sabor 3
                    res = DAO.comandoSQL("SELECT nome,codigo_categoria FROM \"Sabor\" WHERE codigo="+result.getString("codigo_sabor_3"));
                    if(res.next()){
                        sabores += "; "+res.getString("nome");
                        if(tamanho == null){
                            res = DAO.comandoSQL("SELECT tamanho FROM \"Categoria\" WHERE codigo="+res.getString("codigo_categoria"));
                            if(res.next()){
                                tamanho=res.getString("tamanho");
                            }
                        }
                    }
                    
                    //Sabor 4
                    res = DAO.comandoSQL("SELECT nome,codigo_categoria FROM \"Sabor\" WHERE codigo="+result.getString("codigo_sabor_4"));
                    if(res.next()){
                        sabores += "; "+res.getString("nome");
                        if(tamanho == null){
                            res = DAO.comandoSQL("SELECT tamanho FROM \"Categoria\" WHERE codigo="+res.getString("codigo_categoria"));
                            if(res.next()){
                                tamanho=res.getString("tamanho");
                            }
                        }
                    }
                    ped.add(sabores.replaceFirst(";", ""));
                    ped.add(tamanho);
                    ped.add(result.getString("valor"));
                    
                    pedidos.add(ped);
                }
                
                return pedidos;
            } catch (Exception ex) {
                System.out.println("Erro ao carregar itens Pizza Pedido do Banco de Dados!" + ex.getMessage());
                return null;
            }
        } else {
            return null;
        }

    }
    public static ArrayList<ArrayList<String>> carregarDadosBD_ItensPizzas(Integer codPed) {
        ArrayList<ArrayList<String>> pedidos = new ArrayList<>();
        ResultSet result = DAO.comandoSQL("SELECT a.codigo_pizza_pedido, a.codigo_sabor_1, a.codigo_sabor_2, a.codigo_sabor_3, a.codigo_sabor_4, valor "
                + "FROM \"ItemPizzaPedido\" AS a, \"Pedido\" AS b "
                + "WHERE a.codigo_pedido=b.codigo AND a.codigo_pedido = "+ codPed );
        
        ResultSet res;
        if (result != null) {
            try {
                while (result.next()) {
                    ArrayList<String> ped = new ArrayList<String>();
                    String tamanho = null;
                    String sabores = null;
                    
                    //Sabor 1
                    res = DAO.comandoSQL("SELECT nome,codigo_categoria FROM \"Sabor\" WHERE codigo="+result.getString("codigo_sabor_1"));
                    if(res.next()){
                        sabores = "; "+res.getString("nome");
                        res = DAO.comandoSQL("SELECT tamanho FROM \"Categoria\" WHERE codigo="+res.getString("codigo_categoria"));
                        if(res.next()){
                            tamanho=res.getString("tamanho");
                        }
                    }
                    
                    //Sabor 2
                    res = DAO.comandoSQL("SELECT nome,codigo_categoria FROM \"Sabor\" WHERE codigo="+result.getString("codigo_sabor_2"));
                    if(res.next()){
                        sabores += "; "+res.getString("nome");
                        if(tamanho == null){
                            res = DAO.comandoSQL("SELECT tamanho FROM \"Categoria\" WHERE codigo="+res.getString("codigo_categoria"));
                            if(res.next()){
                                tamanho=res.getString("tamanho");
                            }
                        }
                       
                    }
                    
                    //Sabor 3
                    res = DAO.comandoSQL("SELECT nome,codigo_categoria FROM \"Sabor\" WHERE codigo="+result.getString("codigo_sabor_3"));
                    if(res.next()){
                        sabores += "; "+res.getString("nome");
                        if(tamanho == null){
                            res = DAO.comandoSQL("SELECT tamanho FROM \"Categoria\" WHERE codigo="+res.getString("codigo_categoria"));
                            if(res.next()){
                                tamanho=res.getString("tamanho");
                            }
                        }
                    }
                    
                    //Sabor 4
                    res = DAO.comandoSQL("SELECT nome,codigo_categoria FROM \"Sabor\" WHERE codigo="+result.getString("codigo_sabor_4"));
                    if(res.next()){
                        sabores += "; "+res.getString("nome");
                        if(tamanho == null){
                            res = DAO.comandoSQL("SELECT tamanho FROM \"Categoria\" WHERE codigo="+res.getString("codigo_categoria"));
                            if(res.next()){
                                tamanho=res.getString("tamanho");
                            }
                        }
                    }
                    ped.add(result.getString("codigo_pizza_pedido"));
                    ped.add(sabores.replaceFirst(";", ""));
                    //ped.add(tamanho);
                    ped.add(result.getString("valor"));
                    
                    pedidos.add(ped);
                }
                
                return pedidos;
            } catch (Exception ex) {
                System.out.println("Erro ao carregar itens Pizza Pedido do Banco de Dados!" + ex.getMessage());
                return null;
            }
        } else {
            return null;
        }

    }
    
    public static ArrayList<ArrayList<String>> carregarDadosBD_ItemAcompanhentoPedido(Integer codPed) {
        ArrayList<ArrayList<String>> pedidos = new ArrayList<>();
        ResultSet result = DAO.comandoSQL("SELECT a.codigo_item_acompanhamento_pedido, c.nome, a.valor "
                + "FROM \"ItemAcompanhamentoPedido\" AS a,\"Pedido\" AS b, \"Acompanhamento\" AS c "
                + "WHERE a.codigo_pedido=b.codigo AND a.codigo_acompanhamento=c.codigo AND a.codigo_pedido = "+ codPed );
        if (result != null) {
            try {
                while (result.next()) {
                    ArrayList<String> ped = new ArrayList<String>();
                    ped.add(result.getString("codigo_item_acompanhamento_pedido"));
                    ped.add(result.getString("nome"));
                    ped.add(result.getString("valor"));
                    pedidos.add(ped);
                }
                return pedidos;
            } catch (Exception ex) {
                System.out.println("Erro ao carregar itens Acompanhamento Pedido do Banco de Dados!" + ex.getMessage());
                return null;
            }
        }else {
            return null;
        }
    }
    
    
    public static Acompanhamento carregarDadosBD_Acompanhamento(int codigo) {
        Acompanhamento acomp = new Acompanhamento();
        ResultSet result = DAO.selectAll("\"Acompanhamento\"", "WHERE removido = false AND codigo=" + codigo);
        try {
            if (result != null) {
                acomp.setALL(result, true);
                return acomp;
            } else {
                throw new Exception("Erro ao carregar dados do Banco de Dados!");
            }
        } catch (Exception ex) {
            System.out.println("Erro!" + ex.getMessage());
            return null;
        }
    }

    public static boolean carregarDadosBD_Acompanhamentos(ArrayList<Acompanhamento> acomp) {

        ResultSet result = DAO.selectAll("\"Acompanhamento\"", "WHERE removido = false ORDER BY nome ASC");
        if (result != null) {
            try {
                while (result.next()) {
                    Acompanhamento a = new Acompanhamento();
                    a.setALL(result, false);
                    acomp.add(a);
                }
                return true;
            } catch (Exception ex) {
                System.out.println("Erro!" + ex.getMessage());
                return false;
            }
        } else {
            return false;
        }

    }

    public static Categoria carregarDadosBD_Categoria(int codigo) {
        Categoria categoria = new Categoria();
        ResultSet result = DAO.selectAll("\"Categoria\"", "WHERE removido = false AND codigo=" + codigo);
        try {
            if (result != null) {
                categoria.setALL(result, true);
                return categoria;
            } else {
                throw new Exception("Erro ao carregar dados do Banco de Dados!");
            }
        } catch (Exception ex) {
            System.out.println("Erro!" + ex.getMessage());
            return null;
        }

    }

    public static boolean carregarDadosBD_Categorias(ArrayList<Categoria> categorias) {

        ResultSet result = DAO.selectAll("\"Categoria\"", "WHERE removido = false ORDER BY nome ASC");
        if (result != null) {
            try {
                while (result.next()) {
                    Categoria a = new Categoria();
                    a.setALL(result, false);
                    categorias.add(a);
                }
                return true;
            } catch (Exception ex) {
                System.out.println("Erro!" + ex.getMessage());
                return false;
            }
        } else {
            return false;
        }

    }

    public static ArrayList<ArrayList<String>> carregarDadosBD_Categorias() {
        ArrayList<ArrayList<String>> dados = new ArrayList<>();
        ArrayList<Categoria> categorias = new ArrayList<>();
        carregarDadosBD_Categorias(categorias);
        if (categorias.isEmpty()) {
            return null;
        }
        for (int i = 0; i < categorias.size(); i++) {
            ArrayList<String> categ = new ArrayList<>();
            categ.add("" + categorias.get(i).getCodigo());
            categ.add(categorias.get(i).getNome());
            categ.add(categorias.get(i).getTamanho());
            categ.add(categorias.get(i).getValorVisao());

            dados.add(categ);
        }
        return dados;
    }

    public static ArrayList<ArrayList<String>> carregarDadosBD_Sabores() {
        ArrayList<ArrayList<String>> dados = new ArrayList<>();
        ArrayList<Sabor> sabores = new ArrayList<>();
        carregarDadosBD_Sabores(sabores);
        if (sabores.isEmpty()) {
            return null;
        }
        for (int i = 0; i < sabores.size(); i++) {
            ArrayList<String> sabor = convertModeloSaborToDadosVisao(sabores.get(i).getCodigo());
            dados.add(sabor);
        }
        return dados;
    }

    public static Sabor carregarDadosBD_Sabor(int codigo) {
        Sabor sabor = new Sabor();
        ResultSet result = DAO.selectAll("\"Sabor\"", "WHERE removido = false AND codigo=" + codigo);
        if (result != null) {
            try {
                sabor.setALL(result, true);
                ResultSet res = DAO.selectAll("\"Categoria\"", "WHERE codigo=" + sabor.getCodigo_categoria() + " AND " + "removido=false");
                if (res != null && res.next()) {
                    sabor.getCategoria().setALL(res, false);
                }
                return sabor;
            } catch (Exception ex) {
                System.out.println("Erro!" + ex.getMessage());
                return null;
            }
        } else {
            return null;
        }
    }

    public static boolean carregarDadosBD_Sabores(ArrayList<Sabor> sabores) {

        ResultSet result = DAO.selectAll("\"Sabor\"", "WHERE removido = false ORDER BY nome ASC");
        if (result != null) {
            try {
                while (result.next()) {
                    Sabor a = new Sabor();
                    a.setALL(result, false);
                    ResultSet res = DAO.selectAll("\"Categoria\"", "WHERE codigo=" + a.getCodigo_categoria() + " AND " + "removido=false");
                    if (res != null && res.next()) {
                        a.getCategoria().setALL(res, false);
                        sabores.add(a);
                    }
                }
                return true;
            } catch (Exception ex) {
                System.out.println("Erro!" + ex.getMessage());
                return false;
            }
        } else {
            return false;
        }

    }

    public static boolean carregarDadosBD_Clientes(ArrayList<Cliente> cliente) {
        ResultSet result = DAO.selectAll("\"Cliente\"", "WHERE removido = false ORDER BY nome ASC");
        if (result != null) {
            try {
                while (result.next()) {
                    Cliente a = new Cliente();
                    a.setALL(result, false);
                    if (a.getEndereco() != null) {
                        ResultSet res = DAO.selectAll("\"Endereco\"", "WHERE codigo=" + a.getCodigo_endereco());
                        a.getEndereco().setALL(res, true);
                        cliente.add(a);
                    }
                }
                return true;
            } catch (Exception ex) {
                System.out.println("Erro!" + ex.getMessage());
                return false;
            }
        } else {
            return false;
        }
    }

    public static ArrayList<ArrayList<String>> carregarDadosBD_Clientes() {
        ArrayList<ArrayList<String>> dados = new ArrayList<>();
        ArrayList<Cliente> clientes = new ArrayList<>();
        carregarDadosBD_Clientes(clientes);
        if (clientes.isEmpty()) {
            return null;
        }
        for (int i = 0; i < clientes.size(); i++) {
            ArrayList<String> cliente = convertModeloClienteToDadosVisao(clientes.get(i).getCodigo());
            dados.add(cliente);
        }
        return dados;
    }

    public static Cliente carregarDadosBD_Cliente(int codigo) {
        Cliente cliente = new Cliente();
        ResultSet result = DAO.selectAll("\"Cliente\"", "WHERE removido = false AND codigo=" + codigo);
        if (result != null) {
            try {
                cliente.setALL(result, true);

                return cliente;
            } catch (Exception ex) {
                System.out.println("Erro!" + ex.getMessage());
                return null;
            }
        } else {
            return null;
        }
    }
    
    public static Endereco carregarDadosBD_EnderecoEntrega(int codigo) {
        Endereco endereco = new Endereco();
        ResultSet result = DAO.selectAll("\"Endereco\"", "WHERE codigo=" + codigo);
        
        if (result != null) {
            try {
                endereco.setALL(result, true);

                return endereco;
            } catch (Exception ex) {
                System.out.println("Erro!" + ex.getMessage());
                return null;
            }
        } else {
            return null;
        }
    }
    
    public static ArrayList<String> convertModeloEnderecoEntregaToDadosVisao(int codigo) {
        Endereco endereco = carregarDadosBD_EnderecoEntrega(codigo);
        ArrayList<String> param = new ArrayList<>();
        param.add("" + endereco.getCodigo());
        param.add(endereco.getBairro());
        param.add(endereco.getRua());
        param.add(endereco.getNum());
        param.add(endereco.getComplemento());

        return param;
    }

    public static Acompanhamento convertDadosVisaoToModeloAcompanhamento(ArrayList<String> param) {
        Acompanhamento acomp = new Acompanhamento();
        acomp.setCodigo(param.get(0));
        acomp.setNome(param.get(1).toUpperCase());
        acomp.setValor(param.get(2));

        return acomp;
    }

    public static ArrayList<String> convertModeloAcompanhamentoToDadosVisao(int codigo) {
        Acompanhamento acomp = carregarDadosBD_Acompanhamento(codigo);
        ArrayList<String> param = new ArrayList<>();
        param.add("" + acomp.getCodigo());
        param.add(acomp.getNome());
        param.add(acomp.getValorVisao());

        return param;
    }

    public static Sabor convertDadosVisaoToModeloSabor(ArrayList<String> param) {
        Sabor sabor = new Sabor();
        sabor.setCodigo(param.get(0));
        sabor.setNome(param.get(1).toUpperCase());
        sabor.setCodigo_categoria(param.get(2));
        sabor.setIngredientes(param.get(3).toUpperCase());
        if (sabor.getCodigo_categoria() != null) {
            sabor.setCategoria(carregarDadosBD_Categoria(sabor.getCodigo_categoria()));
        }

        return sabor;
    }

    public static ArrayList<String> convertModeloSaborToDadosVisao(int codigo) {
        Sabor sabor = carregarDadosBD_Sabor(codigo);
        ArrayList<String> param = new ArrayList<>();
        param.add("" + sabor.getCodigo());
        param.add(sabor.getNome().toUpperCase());
        if (sabor.getIngredientes() != null) {
            param.add(sabor.getIngredientes_Visao().toUpperCase());
        } else {
            param.add("");
        }
        param.add("" + sabor.getCodigo_categoria());
        param.add("" + sabor.getCategoria().getNome().toUpperCase());

        return param;
    }

    public static Categoria convertDadosVisaoToModeloCategoria(ArrayList<String> param) {
        Categoria categ = new Categoria();
        categ.setCodigo(param.get(0));
        categ.setNome(param.get(1).toUpperCase());
        categ.setTamanho(param.get(2));
        categ.setValor(param.get(3));

        return categ;
    }

    public static ArrayList<String> convertModeloCategoriaToDadosVisao(int codigo) {
        Categoria categ = carregarDadosBD_Categoria(codigo);
        ArrayList<String> param = new ArrayList<>();
        param.add("" + categ.getCodigo());
        param.add(categ.getNome());
        param.add(categ.getTamanho());
        param.add(categ.getValorVisao());

        return param;
    }

    public static Cliente convertDadosVisaoToModeloCliente(ArrayList<String> param) {
        Cliente cliente = new Cliente();
        cliente.setCodigo(param.get(0));
        cliente.setNome(param.get(1).toUpperCase());
        cliente.setRg(param.get(2));
        cliente.setData_nasc(param.get(3));
        cliente.setSexo(param.get(4));
        cliente.setTel_1(param.get(5));
        cliente.setTel_2(param.get(6));
        cliente.getEndereco().setCodigo(param.get(7));
        cliente.getEndereco().setBairro(param.get(8));
        cliente.getEndereco().setRua(param.get(9));
        cliente.getEndereco().setNum(param.get(10));
        cliente.getEndereco().setComplemento(param.get(11));

        return cliente;
    }

    public static ArrayList<String> convertModeloClienteToDadosVisao(int codigo) {
        Cliente cliente = carregarDadosBD_Cliente(codigo);
        ArrayList<String> param = new ArrayList<>();
        param.add("" + cliente.getCodigo());
        param.add(cliente.getNome().toUpperCase());
        param.add(cliente.getRg());
        param.add(cliente.getData_nascVisao());
        param.add(cliente.getSexo());
        param.add(cliente.getTel_1());
        param.add(cliente.getTel_2());
        param.add("" + cliente.getEndereco().getCodigo());
        param.add("" + cliente.getEndereco().getBairro());
        if (cliente.getEndereco().getRua() != null) {
            param.add(cliente.getEndereco().getRua().toUpperCase());
        } else {
            param.add("");
        }
        param.add("" + cliente.getEndereco().getNumVisao());
        if (cliente.getEndereco().getComplemento() != null) {
            param.add(cliente.getEndereco().getComplemento().toUpperCase());
        } else {
            param.add("");
        }

        return param;
    }
    
    public static boolean remover_ItemAcompanhamentoPedido( int codigoPedido, int codigoItemAcomp){
        try {
            DAO.comandoSQL("DELETE FROM \"ItemAcompanhamentoPedido\"  WHERE codigo_item_acompanhamento_pedido = "+codigoItemAcomp);
            Float valor = calcularValorPedido(codigoPedido);
            DAO.comandoSQL("UPDATE \"Pedido\" SET valor_total="+valor+" WHERE codigo = "+codigoPedido);
            JOptionPane.showMessageDialog(null, "O Acompanhamento foi Removido com Sucesso!","Remover",1);
            return true;
            
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, "Erro!\n Não foi possivel Remover o Acompanhamento\n" + ex.getMessage(),"Remover",0);
            return false;
        }
    }
    
    public static boolean remover_ItemPizzaPedido( int codigoPedido, int codigoItemPizza){
        try {
            DAO.comandoSQL("DELETE FROM \"ItemPizzaPedido\"  WHERE codigo_pizza_pedido = "+codigoItemPizza);
            Float valor = calcularValorPedido(codigoPedido);
            DAO.comandoSQL("UPDATE \"Pedido\" SET valor_total="+valor+" WHERE codigo = "+codigoPedido);
            JOptionPane.showMessageDialog(null, "A Pizza foi Removido com Sucesso!","Remover",1);
            return true;
            
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, "Erro!\n Não foi possivel Remover a Pizza\n" + ex.getMessage(),"Remover",0);
            return false;
        }
    }
    
    public static boolean cancelar_Pedido( int codigoPedido){
        try {
           
            DAO.comandoSQL("UPDATE \"Pedido\" SET status='Cancelado' WHERE codigo = "+codigoPedido);
            JOptionPane.showMessageDialog(null, "O Pedido foi Cancelado com Sucesso!","Cancelar Pedido",1);
            return true;
            
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, "Erro!\n Não foi possivel Cancelar o Pedido\n" + ex.getMessage(),"Cancelar Pedido",0);
            return false;
        }
    }
    
    public static boolean finalizar_Pedido( int codigoPedido){
        try {
           
            DAO.comandoSQL("UPDATE \"Pedido\" SET status='Finalizado' WHERE codigo = "+codigoPedido);
            JOptionPane.showMessageDialog(null, "O Pedido foi Finalizado com Sucesso!","Finalizar Pedido",1);
            return true;
            
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, "Erro!\n Não foi possivel Finalizar o Pedido\n" + ex.getMessage(),"Finalizar Pedido",0);
            return false;
        }
    }
    
    public static boolean pagar_Pedido( int codigoPedido){
        try {
           
            DAO.comandoSQL("UPDATE \"Pedido\" SET status='Pago' WHERE codigo = "+codigoPedido);
            JOptionPane.showMessageDialog(null, "O Pedido foi Pago com Sucesso!","Pagar Pedido",1);
            return true;
            
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, "Erro!\n Não foi possivel Pagar o Pedido\n" + ex.getMessage(),"Pagar  Pedido",0);
            return false;
        }
    }
    
    public static Integer get_CodigoEnderecoEntregaPedido( int codigoPedido){
        try {
           
            String cod = DAO.selectColuna("\"Pedido\"", "codigo_endereco_entrega", " WHERE codigo = "+codigoPedido);
            return Integer.parseInt(cod);
            
        } catch (Exception ex) {
            //JOptionPane.showMessageDialog(null, "Erro!\n Não foi possivel Pagar o Pedido\n" + ex.getMessage(),"Pagar  Pedido",0);
            System.out.println("Erro no get_CodigoEnderecoEntregaPedido() \n"+ex.getMessage());
            return null;
        }
    }
    
    
    public static Relatorio carregarDadosBD_RelSabores(String dataIni, String dataFim) {
        Relatorio relatorio = new Relatorio();
        relatorio.setDataIni(dataIni);
        relatorio.setDataFim(dataFim);
        
        ResultSet result = DAO.comandoSQL(relatorio.getSqlRelPizza());
        try {
            if (result != null) {
                relatorio.setALL_Sabores(result, false);
                return relatorio;
            } else {
                throw new Exception("Erro ao carregar dados do Banco de Dados!");
            }
        } catch (Exception ex) {
            System.out.println("Erro!" + ex.getMessage());
            return null;
        }
    }
    
    public static Relatorio carregarDadosBD_RelAcomp(String dataIni, String dataFim) {
        Relatorio relatorio = new Relatorio();
        relatorio.setDataIni(dataIni);
        relatorio.setDataFim(dataFim);
        
        ResultSet result = DAO.comandoSQL(relatorio.getSqlRelAcompanhamentos());
        try {
            if (result != null) {
                relatorio.setALL_Acomp(result, false);
                return relatorio;
            } else {
                throw new Exception("Erro ao carregar dados do Banco de Dados!");
            }
        } catch (Exception ex) {
            System.out.println("Erro!" + ex.getMessage());
            return null;
        }
    }
    
    public static Relatorio carregarDadosBD_RelPedidos(String dataIni, String dataFim) {
        Relatorio relatorio = new Relatorio();
        relatorio.setDataIni(dataIni);
        relatorio.setDataFim(dataFim);
        
        ResultSet result = DAO.comandoSQL(relatorio.getSqlRelPedidos());
        try {
            if (result != null) {
                relatorio.setALL_Pedidos(result, false);
                return relatorio;
            } else {
                throw new Exception("Erro ao carregar dados do Banco de Dados!");
            }
        } catch (Exception ex) {
            System.out.println("Erro!" + ex.getMessage());
            return null;
        }
    }
    
    public static Relatorio carregarDadosBD_RelItensPedido(int codPedido) {
        Relatorio relatorio = new Relatorio();
        relatorio.setCodPedido(""+codPedido);
        
        
        ResultSet result = DAO.comandoSQL(relatorio.getSqlRelItensPedPizza());
        ResultSet result2 = DAO.comandoSQL(relatorio.getSqlRelItensPedAcomp());
        try {
            if (result != null || result2 != null) {
                relatorio.setALL_ItensPedido(result, result2, false);
                return relatorio;
            } else {
                throw new Exception("Erro ao carregar dados do Banco de Dados!");
            }
        } catch (Exception ex) {
            System.out.println("Erro!" + ex.getMessage());
            return null;
        }
    }
    
    public static void gerarPdfRelatorioItensPedido(int codPedido){
        Relatorio relatorio;
        relatorio = carregarDadosBD_RelItensPedido(codPedido);
    }
    
    public static void gerarNota(int codPedido){
        
    }
}
